package cn.edu.fzu.delivery.service;

import cn.edu.fzu.delivery.domain.dto.CourierDeliveryPathDto;
import cn.edu.fzu.delivery.domain.entity.Courier;
import cn.edu.fzu.delivery.domain.entity.Customer;
import cn.edu.fzu.delivery.domain.entity.SysUser;
import cn.edu.fzu.delivery.domain.enums.CourierStatusEnum;
import cn.edu.fzu.delivery.domain.enums.CourierTypeEnum;
import cn.edu.fzu.delivery.domain.enums.UrgencyEnum;

import java.math.BigDecimal;
import java.util.List;

/**
 * 快递业务层
 *
 * @author fangxin
 * @date 2022/11/8
 */
public interface CourierService {

    /**
     * 查询出顾客的寄件
     * 
     * @param phone 手机号
     * @param courierIds 快递单号，逗号分隔
     * @param type 类型
     * @param status 状态
     * @param urgency 紧急程度
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    List<Courier> listCustomerSend(String phone, List<String> courierIds, CourierTypeEnum type,
                                   CourierStatusEnum status, UrgencyEnum urgency, String startTime, String endTime);


    /**
     * 查询出顾客的收件
     *
     * @param phone 手机号
     * @param courierIds 快递单号，逗号分隔
     * @param type 类型
     * @param status 状态
     * @param urgency 紧急程度
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    List<Courier> listCustomerReceive(String phone, List<String> courierIds, CourierTypeEnum type,
                                      CourierStatusEnum status, UrgencyEnum urgency, String startTime, String endTime);


    /**
     * 根据快递状态查询所有快递
     * 
     * @param status
     * @return
     */
    List<Courier> listByStatus(CourierStatusEnum status);


    /**
     * 通过快递号查询出快递
     * 
     * @param courierId 快递单号
     * @return
     */
    Courier getByCourierId(String courierId);


    /**
     * 寄件
     * 
     * @param sendAddressId 寄件地址id ，可选
     * @param receiveAddressId 收件地址id，可选
     * @param sender 寄件人
     * @param sendNetworkId 寄件网点id
     * @param senderAddress 寄件人详细地址
     * @param receiverName 收件人姓名
     * @param receiverPhone 收件人手机号
     * @param receiverEmail 收件人邮箱
     * @param receiveNetworkId 收件网点
     * @param receiverAddress 收件人详细地址
     * @param type 类型
     * @param urgency 紧急程度
     */
    void send(String userCity,Long sendAddressId, Long receiveAddressId, Customer sender, Long sendNetworkId, String senderAddress,
              String receiverName, String receiverPhone, String receiverEmail, Long receiveNetworkId,
              String receiverAddress, CourierTypeEnum type, UrgencyEnum urgency);


    /**
     * 修改快递状态
     *
     * @param courierId 快递单号
     * @param status 状态
     * @param endTime 快递签收时间
     * @param info 是否通知用户
     */
    void update(String courierId, Double weight, CourierStatusEnum status, Long logisticsId, String endTime,
                boolean info);


    /**
     * 分配快递员
     * 
     * @param courierId 快递单号
     * @param deliveryMan 快递员
     */
    void allot(String courierId, SysUser deliveryMan);


    /**
     * 查询快递单价
     * 
     * @param type 快递类别
     * @return 单价
     */
    BigDecimal queryPrice(CourierTypeEnum type);


    /**
     * 获取快递的运输路径
     *
     * @param courierId 快递单号
     * @return 快递的运输途径网点和天数
     */
    CourierDeliveryPathDto getDeliveryPath(String courierId);


    List<Courier> listByCourierIds(List<String> courierIds);


    /**
     * 快递催促
     * 
     * @param courierId 快递单号
     */
    void urge(String courierId);
}
